home *** CD-ROM | disk | FTP | other *** search
/ Isometric Game Programming with DirectX 7.0 / Isometric Game Programming.iso / source / chapter17 / isohex17_1 / isohex17_1.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-08-19  |  16.2 KB  |  594 lines

  1. /*****************************************************************************
  2. IsoHex17_1.cpp
  3. Ernest S. Pazera
  4. 15AUG2000
  5. Start a WIN32 Application Workspace, add in this file
  6. Requires the following libs:
  7. ddraw.lib, dxguid.lib
  8. Requires the following files:
  9. DDFuncs.h.cpp, GDICanvas.h/cpp, IsoMouseMap.h/cpp,
  10. IsoScroller.h/cpp, IsoTilePlotter.h/cpp, IsoTileWalker.h/cpp
  11. TileSet.h/cpp. IsoHexCore.h, IsoHexDefs.h
  12. *****************************************************************************/
  13.  
  14. //////////////////////////////////////////////////////////////////////////////
  15. //INCLUDES
  16. //////////////////////////////////////////////////////////////////////////////
  17. #define WIN32_LEAN_AND_MEAN  
  18.  
  19. #include <windows.h>  
  20. #include "DDFuncs.h"
  21. #include "TileSet.h"
  22. #include "IsoHexCore.h"
  23.  
  24.  
  25. //////////////////////////////////////////////////////////////////////////////
  26. //DEFINES
  27. //////////////////////////////////////////////////////////////////////////////
  28. //name for our window class
  29. #define WINDOWCLASS "ISOHEX17"
  30. //title of the application
  31. #define WINDOWTITLE "IsoHex 17-1"
  32.  
  33. const int MAPWIDTH=200;
  34. const int MAPHEIGHT=400;
  35.  
  36. //////////////////////////////////////////////////////////////////////////////
  37. //PROTOTYPES
  38. //////////////////////////////////////////////////////////////////////////////
  39. bool Prog_Init();//game data initalizer
  40. void Prog_Loop();//main game loop
  41. void Prog_Done();//game clean up
  42.  
  43. //////////////////////////////////////////////////////////////////////////////
  44. //GLOBALS
  45. //////////////////////////////////////////////////////////////////////////////
  46. HINSTANCE hInstMain=NULL;//main application handle
  47. HWND hWndMain=NULL;//handle to our main window
  48.  
  49. //directdraw
  50. LPDIRECTDRAW7 lpdd=NULL;
  51. LPDIRECTDRAWSURFACE7 lpddsMain=NULL;
  52. LPDIRECTDRAWSURFACE7 lpddsBack=NULL;
  53.  
  54. //tilesets
  55. CTileSet tsBack;//background
  56. CTileSet tsShadow;//tree shadow
  57. CTileSet tsTree;//tree foreground
  58. CTileSet tsCursor;//cursor
  59.  
  60. //isohexcore components
  61. CTilePlotter TilePlotter;//plotter
  62. CTileWalker TileWalker;//walker
  63. CScroller Scroller;//scroller
  64. CMouseMap MouseMap;//mousemap
  65.  
  66. POINT ptCursor;//keep track of the cursor
  67. POINT ptScroll;//keep track of how quickly we scroll
  68.  
  69. int iMap[MAPWIDTH][MAPHEIGHT];//map array(0=no tree, 1=tree)
  70.  
  71. //////////////////////////////////////////////////////////////////////////////
  72. //WINDOWPROC
  73. //////////////////////////////////////////////////////////////////////////////
  74. LRESULT CALLBACK TheWindowProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  75. {
  76.     //which message did we get?
  77.     switch(uMsg)
  78.     {
  79.     case WM_KEYDOWN:
  80.         {
  81.             switch(wParam)
  82.             {
  83.             case VK_ESCAPE:
  84.                 {
  85.                     DestroyWindow(hWndMain);
  86.                     return(0);
  87.                 }break;
  88.             }
  89.         }break;
  90.     case WM_LBUTTONDOWN:
  91.         {
  92.             //change the status of the map
  93.             iMap[ptCursor.x][ptCursor.y]=1-iMap[ptCursor.x][ptCursor.y];
  94.             return(0);
  95.         }break;
  96.     case WM_MOUSEMOVE:
  97.         {
  98.             //grab mouse x and y
  99.             int x=LOWORD(lParam);
  100.             int y=HIWORD(lParam);
  101.  
  102.             //reset scrolling speeds to zero
  103.             ptScroll.x=0;
  104.             ptScroll.y=0;
  105.  
  106.             //left scroll?
  107.             if(x<8) ptScroll.x=x-8;
  108.  
  109.             //upward scroll?
  110.             if(y<8) ptScroll.y=y-8;
  111.  
  112.             //right scroll?
  113.             if(x>=632) ptScroll.x=x-632;
  114.  
  115.             //downward scroll?
  116.             if(y>=472) ptScroll.y=y-472;
  117.         }break;
  118.     case WM_DESTROY://the window is being destroyed
  119.         {
  120.  
  121.             //tell the application we are quitting
  122.             PostQuitMessage(0);
  123.  
  124.             //handled message, so return 0
  125.             return(0);
  126.  
  127.         }break;
  128.     case WM_PAINT://the window needs repainting
  129.         {
  130.             //a variable needed for painting information
  131.             PAINTSTRUCT ps;
  132.             
  133.             //start painting
  134.             HDC hdc=BeginPaint(hwnd,&ps);
  135.  
  136.             /////////////////////////////
  137.             //painting code would go here
  138.             /////////////////////////////
  139.  
  140.             //end painting
  141.             EndPaint(hwnd,&ps);
  142.                         
  143.             //handled message, so return 0
  144.             return(0);
  145.         }break;
  146.     }
  147.  
  148.     //pass along any other message to default message handler
  149.     return(DefWindowProc(hwnd,uMsg,wParam,lParam));
  150. }
  151.  
  152.  
  153. //////////////////////////////////////////////////////////////////////////////
  154. //WINMAIN
  155. //////////////////////////////////////////////////////////////////////////////
  156. int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
  157. {
  158.     //assign instance to global variable
  159.     hInstMain=hInstance;
  160.  
  161.     //create window class
  162.     WNDCLASSEX wcx;
  163.  
  164.     //set the size of the structure
  165.     wcx.cbSize=sizeof(WNDCLASSEX);
  166.  
  167.     //class style
  168.     wcx.style=CS_OWNDC | CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS;
  169.  
  170.     //window procedure
  171.     wcx.lpfnWndProc=TheWindowProc;
  172.  
  173.     //class extra
  174.     wcx.cbClsExtra=0;
  175.  
  176.     //window extra
  177.     wcx.cbWndExtra=0;
  178.  
  179.     //application handle
  180.     wcx.hInstance=hInstMain;
  181.  
  182.     //icon
  183.     wcx.hIcon=LoadIcon(NULL,IDI_APPLICATION);
  184.  
  185.     //cursor
  186.     wcx.hCursor=LoadCursor(NULL,IDC_ARROW);
  187.  
  188.     //background color
  189.     wcx.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
  190.  
  191.     //menu
  192.     wcx.lpszMenuName=NULL;
  193.  
  194.     //class name
  195.     wcx.lpszClassName=WINDOWCLASS;
  196.  
  197.     //small icon
  198.     wcx.hIconSm=NULL;
  199.  
  200.     //register the window class, return 0 if not successful
  201.     if(!RegisterClassEx(&wcx)) return(0);
  202.  
  203.     //create main window
  204.     hWndMain=CreateWindowEx(0,WINDOWCLASS,WINDOWTITLE, WS_POPUP | WS_VISIBLE,0,0,320,240,NULL,NULL,hInstMain,NULL);
  205.  
  206.     //error check
  207.     if(!hWndMain) return(0);
  208.  
  209.     //if program initialization failed, then return with 0
  210.     if(!Prog_Init()) return(0);
  211.  
  212.     //message structure
  213.     MSG msg;
  214.  
  215.     //message pump
  216.     for(;;)    
  217.     {
  218.         //look for a message
  219.         if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
  220.         {
  221.             //there is a message
  222.  
  223.             //check that we arent quitting
  224.             if(msg.message==WM_QUIT) break;
  225.             
  226.             //translate message
  227.             TranslateMessage(&msg);
  228.  
  229.             //dispatch message
  230.             DispatchMessage(&msg);
  231.         }
  232.  
  233.         //run main game loop
  234.         Prog_Loop();
  235.     }
  236.     
  237.     //clean up program data
  238.     Prog_Done();
  239.  
  240.     //return the wparam from the WM_QUIT message
  241.     return(msg.wParam);
  242. }
  243.  
  244. //////////////////////////////////////////////////////////////////////////////
  245. //INITIALIZATION
  246. //////////////////////////////////////////////////////////////////////////////
  247. bool Prog_Init()
  248. {
  249.     //create IDirectDraw object
  250.     lpdd=LPDD_Create(hWndMain,DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN | DDSCL_ALLOWREBOOT);
  251.  
  252.     //set display mode
  253.     lpdd->SetDisplayMode(640,480,16,0,0);
  254.  
  255.     //create primary surface
  256.     lpddsMain=LPDDS_CreatePrimary(lpdd,1);
  257.  
  258.     //get back buffer
  259.     lpddsBack=LPDDS_GetSecondary(lpddsMain);
  260.  
  261.     //load in the mousemap
  262.     MouseMap.Load("MouseMap.bmp");
  263.  
  264.     //set up the tile plotter
  265.     TilePlotter.SetMapType(ISOMAP_DIAMOND);//diamond mode
  266.     TilePlotter.SetTileSize(MouseMap.GetWidth(),MouseMap.GetHeight());//grab width and height from mousemap
  267.  
  268.     //set up tile walker to diamond mode
  269.     TileWalker.SetMapType(ISOMAP_DIAMOND);
  270.  
  271.     //set up screeen space
  272.     RECT rcTemp;
  273.     SetRect(&rcTemp,0,0,640,480);
  274.     Scroller.SetScreenSpace(&rcTemp);
  275.  
  276.     //load in tiles and cursor
  277.     tsBack.Load(lpdd,"backgroundts.bmp");
  278.     tsShadow.Load(lpdd,"treeshadowts.bmp");
  279.     tsTree.Load(lpdd,"treets.bmp");
  280.     tsCursor.Load(lpdd,"cursor.bmp");
  281.  
  282.     //grab tile extent from tileset
  283.     CopyRect(&rcTemp,&tsBack.GetTileList()[0].rcDstExt);
  284.  
  285.     //calculate the worldspace
  286.     Scroller.CalcWorldSpace(&TilePlotter,&rcTemp,MAPWIDTH,MAPHEIGHT);
  287.  
  288.     //calculate the mousemap reference point
  289.     MouseMap.CalcReferencePoint(&TilePlotter,&rcTemp);
  290.  
  291.     //calculate anchor space
  292.     Scroller.CalcAnchorSpace();
  293.  
  294.     //set wrap modes for scroller
  295.     Scroller.SetHWrapMode(WRAPMODE_CLIP);
  296.     Scroller.SetVWrapMode(WRAPMODE_CLIP);
  297.  
  298.     //set scroller anchor to (0,0)
  299.     Scroller.GetAnchor()->x=0;
  300.     Scroller.GetAnchor()->y=0;
  301.  
  302.     //attach scrolelr and tilewalker to mousemap
  303.     MouseMap.SetScroller(&Scroller);
  304.     MouseMap.SetTileWalker(&TileWalker);
  305.  
  306.     //set up the map to a random tilefield
  307.     for(int x=0;x<MAPWIDTH;x++)
  308.     {
  309.         for(int y=0;y<MAPHEIGHT;y++)
  310.         {
  311.             iMap[x][y]=rand()%2;
  312.         }
  313.     }
  314.  
  315.     return(true);//return success
  316. }
  317.  
  318. //////////////////////////////////////////////////////////////////////////////
  319. //CLEANUP
  320. //////////////////////////////////////////////////////////////////////////////
  321. void Prog_Done()
  322. {
  323.     //release main/back surfaces
  324.     LPDDS_Release(&lpddsMain);
  325.  
  326.     //release directdraw
  327.     LPDD_Release(&lpdd);
  328. }
  329.  
  330. //////////////////////////////////////////////////////////////////////////////
  331. //MAIN GAME LOOP
  332. //////////////////////////////////////////////////////////////////////////////
  333. void Prog_Loop()
  334. {
  335.     //clear out backbuffer
  336.     DDBLTFX ddbltfx;
  337.     DDBLTFX_ColorFill(&ddbltfx,0);
  338.     lpddsBack->Blt(NULL,NULL,NULL,DDBLT_WAIT | DDBLT_COLORFILL,&ddbltfx);
  339.     
  340.     //move the anchor based on scrolling speed
  341.     Scroller.MoveAnchor(ptScroll.x,ptScroll.y);
  342.  
  343.     //grab the mouse position
  344.     POINT ptMouse;
  345.     GetCursorPos(&ptMouse);
  346.     //map the mouse
  347.     ptCursor=MouseMap.MapMouse(ptMouse);
  348.  
  349.     //clip the cursor to valid map coordinates
  350.     if(ptCursor.x<0) ptCursor.x=0;
  351.     if(ptCursor.y<0) ptCursor.y=0;
  352.     if(ptCursor.x>(MAPWIDTH-1)) ptCursor.x=MAPWIDTH-1;
  353.     if(ptCursor.y>(MAPHEIGHT-1)) ptCursor.y=MAPHEIGHT-1;
  354.  
  355.     //the corner map locations of the display
  356.     POINT ptCornerUpperLeft;
  357.     POINT ptCornerUpperRight;
  358.     POINT ptCornerLowerLeft;
  359.     POINT ptCornerLowerRight;
  360.  
  361.     //working variables for calculating corners
  362.     POINT ptScreen;
  363.     POINT ptWorld;
  364.     POINT ptCoarse;
  365.     POINT ptMap;
  366.  
  367.     //calculate upper left corner
  368.     //screen point
  369.     ptScreen.x=Scroller.GetScreenSpace()->left;
  370.     ptScreen.y=Scroller.GetScreenSpace()->top;
  371.     //change into world coordinate
  372.     ptWorld=Scroller.ScreenToWorld(ptScreen);
  373.     //adjust by mousemap reference point    
  374.     ptWorld.x-=MouseMap.GetReferencePoint()->x;
  375.     ptWorld.y-=MouseMap.GetReferencePoint()->y;
  376.     //calculate coarse coordinates
  377.     ptCoarse.x=ptWorld.x/MouseMap.GetWidth();
  378.     ptCoarse.y=ptWorld.y/MouseMap.GetHeight();
  379.     //adjust for negative remainders
  380.     if(ptWorld.x%MouseMap.GetWidth()<0) ptCoarse.x--;
  381.     if(ptWorld.y%MouseMap.GetHeight()<0) ptCoarse.y--;
  382.     //set map point to 0,0
  383.     ptMap.x=0;
  384.     ptMap.y=0;
  385.     //do eastward tilewalk
  386.     ptMap=TileWalker.TileWalk(ptMap,ISO_EAST);
  387.     ptMap.x*=ptCoarse.x;
  388.     ptMap.y*=ptCoarse.x;
  389.     //assign ptmap to corner point
  390.     ptCornerUpperLeft.x=ptMap.x;
  391.     ptCornerUpperLeft.y=ptMap.y;
  392.     //reset ptmap to 0,0
  393.     ptMap.x=0;
  394.     ptMap.y=0;
  395.     //do southward tilewalk
  396.     ptMap=TileWalker.TileWalk(ptMap,ISO_SOUTH);
  397.     ptMap.x*=ptCoarse.y;
  398.     ptMap.y*=ptCoarse.y;
  399.     //add ptmap to corner point
  400.     ptCornerUpperLeft.x+=ptMap.x;
  401.     ptCornerUpperLeft.y+=ptMap.y;
  402.  
  403.     //calculate upper right corner
  404.     //screen point
  405.     ptScreen.x=Scroller.GetScreenSpace()->right;
  406.     ptScreen.y=Scroller.GetScreenSpace()->top;
  407.     //change into world coordinate
  408.     ptWorld=Scroller.ScreenToWorld(ptScreen);
  409.     //adjust by mousemap reference point    
  410.     ptWorld.x-=MouseMap.GetReferencePoint()->x;
  411.     ptWorld.y-=MouseMap.GetReferencePoint()->y;
  412.     //calculate coarse coordinates
  413.     ptCoarse.x=ptWorld.x/MouseMap.GetWidth();
  414.     ptCoarse.y=ptWorld.y/MouseMap.GetHeight();
  415.     //adjust for negative remainders
  416.     if(ptWorld.x%MouseMap.GetWidth()<0) ptCoarse.x--;
  417.     if(ptWorld.y%MouseMap.GetHeight()<0) ptCoarse.y--;
  418.     //set map point to 0,0
  419.     ptMap.x=0;
  420.     ptMap.y=0;
  421.     //do eastward tilewalk
  422.     ptMap=TileWalker.TileWalk(ptMap,ISO_EAST);
  423.     ptMap.x*=ptCoarse.x;
  424.     ptMap.y*=ptCoarse.x;
  425.     //assign ptmap to corner point
  426.     ptCornerUpperRight.x=ptMap.x;
  427.     ptCornerUpperRight.y=ptMap.y;
  428.     //reset ptmap to 0,0
  429.     ptMap.x=0;
  430.     ptMap.y=0;
  431.     //do southward tilewalk
  432.     ptMap=TileWalker.TileWalk(ptMap,ISO_SOUTH);
  433.     ptMap.x*=ptCoarse.y;
  434.     ptMap.y*=ptCoarse.y;
  435.     //add ptmap to corner point
  436.     ptCornerUpperRight.x+=ptMap.x;
  437.     ptCornerUpperRight.y+=ptMap.y;
  438.  
  439.     //calculate lower left corner
  440.     //screen point
  441.     ptScreen.x=Scroller.GetScreenSpace()->left;
  442.     ptScreen.y=Scroller.GetScreenSpace()->bottom;
  443.     //change into world coordinate
  444.     ptWorld=Scroller.ScreenToWorld(ptScreen);
  445.     //adjust by mousemap reference point    
  446.     ptWorld.x-=MouseMap.GetReferencePoint()->x;
  447.     ptWorld.y-=MouseMap.GetReferencePoint()->y;
  448.     //calculate coarse coordinates
  449.     ptCoarse.x=ptWorld.x/MouseMap.GetWidth();
  450.     ptCoarse.y=ptWorld.y/MouseMap.GetHeight();
  451.     //adjust for negative remainders
  452.     if(ptWorld.x%MouseMap.GetWidth()<0) ptCoarse.x--;
  453.     if(ptWorld.y%MouseMap.GetHeight()<0) ptCoarse.y--;
  454.     //set map point to 0,0
  455.     ptMap.x=0;
  456.     ptMap.y=0;
  457.     //do eastward tilewalk
  458.     ptMap=TileWalker.TileWalk(ptMap,ISO_EAST);
  459.     ptMap.x*=ptCoarse.x;
  460.     ptMap.y*=ptCoarse.x;
  461.     //assign ptmap to corner point
  462.     ptCornerLowerLeft.x=ptMap.x;
  463.     ptCornerLowerLeft.y=ptMap.y;
  464.     //reset ptmap to 0,0
  465.     ptMap.x=0;
  466.     ptMap.y=0;
  467.     //do southward tilewalk
  468.     ptMap=TileWalker.TileWalk(ptMap,ISO_SOUTH);
  469.     ptMap.x*=ptCoarse.y;
  470.     ptMap.y*=ptCoarse.y;
  471.     //add ptmap to corner point
  472.     ptCornerLowerLeft.x+=ptMap.x;
  473.     ptCornerLowerLeft.y+=ptMap.y;
  474.  
  475.     //calculate lower right corner
  476.     //screen point
  477.     ptScreen.x=Scroller.GetScreenSpace()->right;
  478.     ptScreen.y=Scroller.GetScreenSpace()->bottom;
  479.     //change into world coordinate
  480.     ptWorld=Scroller.ScreenToWorld(ptScreen);
  481.     //adjust by mousemap reference point    
  482.     ptWorld.x-=MouseMap.GetReferencePoint()->x;
  483.     ptWorld.y-=MouseMap.GetReferencePoint()->y;
  484.     //calculate coarse coordinates
  485.     ptCoarse.x=ptWorld.x/MouseMap.GetWidth();
  486.     ptCoarse.y=ptWorld.y/MouseMap.GetHeight();
  487.     //adjust for negative remainders
  488.     if(ptWorld.x%MouseMap.GetWidth()<0) ptCoarse.x--;
  489.     if(ptWorld.y%MouseMap.GetHeight()<0) ptCoarse.y--;
  490.     //set map point to 0,0
  491.     ptMap.x=0;
  492.     ptMap.y=0;
  493.     //do eastward tilewalk
  494.     ptMap=TileWalker.TileWalk(ptMap,ISO_EAST);
  495.     ptMap.x*=ptCoarse.x;
  496.     ptMap.y*=ptCoarse.x;
  497.     //assign ptmap to corner point
  498.     ptCornerLowerRight.x=ptMap.x;
  499.     ptCornerLowerRight.y=ptMap.y;
  500.     //reset ptmap to 0,0
  501.     ptMap.x=0;
  502.     ptMap.y=0;
  503.     //do southward tilewalk
  504.     ptMap=TileWalker.TileWalk(ptMap,ISO_SOUTH);
  505.     ptMap.x*=ptCoarse.y;
  506.     ptMap.y*=ptCoarse.y;
  507.     //add ptmap to corner point
  508.     ptCornerLowerRight.x+=ptMap.x;
  509.     ptCornerLowerRight.y+=ptMap.y;
  510.  
  511.     //tilewalk from corners
  512.     ptCornerUpperLeft=TileWalker.TileWalk(ptCornerUpperLeft,ISO_NORTHWEST);
  513.     ptCornerUpperRight=TileWalker.TileWalk(ptCornerUpperRight,ISO_NORTHEAST);
  514.     ptCornerLowerLeft=TileWalker.TileWalk(ptCornerLowerLeft,ISO_SOUTHWEST);
  515.     ptCornerLowerRight=TileWalker.TileWalk(ptCornerLowerRight,ISO_SOUTHEAST);
  516.  
  517.     //move left corners to the west by one
  518.     ptCornerUpperLeft=TileWalker.TileWalk(ptCornerUpperLeft,ISO_WEST);
  519.     ptCornerLowerLeft=TileWalker.TileWalk(ptCornerLowerLeft,ISO_WEST);
  520.  
  521.     //move the lower corners to the south by one
  522.     ptCornerLowerLeft=TileWalker.TileWalk(ptCornerLowerLeft,ISO_SOUTH);
  523.     ptCornerLowerRight=TileWalker.TileWalk(ptCornerLowerRight,ISO_SOUTH);
  524.  
  525.     //main rendering loop
  526.     //vars for rendering loop
  527.     POINT ptCurrent;
  528.     POINT ptRowStart;
  529.     POINT ptRowEnd;
  530.     DWORD dwRowCount=0;
  531.  
  532.     //set up rows
  533.     ptRowStart=ptCornerUpperLeft;
  534.     ptRowEnd=ptCornerUpperRight;
  535.  
  536.     //start rendering loops
  537.     for(;;)//"infinite" loop
  538.     {
  539.         //set current point to rowstart
  540.         ptCurrent=ptRowStart;
  541.  
  542.         //render a row of tiles
  543.         for(;;)//'infinite' loop
  544.         {
  545.  
  546.             //check for valid point. if valid, render
  547.             if(ptCurrent.x>=0 && ptCurrent.y>=0 && ptCurrent.x<MAPWIDTH && ptCurrent.y<MAPHEIGHT)
  548.             {
  549.                 //valid, so render
  550.                 ptScreen=TilePlotter.PlotTile(ptCurrent);//plot tile
  551.                 ptScreen=Scroller.WorldToScreen(ptScreen);//world->screen
  552.                 tsBack.ClipTile(lpddsBack,Scroller.GetScreenSpace(),ptScreen.x,ptScreen.y,0);//put background tile
  553.                 if(iMap[ptCurrent.x][ptCurrent.y])//check for tree
  554.                 {
  555.                     tsShadow.ClipTile(lpddsBack,Scroller.GetScreenSpace(),ptScreen.x,ptScreen.y,0);//put shadow
  556.                     tsTree.ClipTile(lpddsBack,Scroller.GetScreenSpace(),ptScreen.x,ptScreen.y,0);//put tree
  557.                 }
  558.             }
  559.             
  560.             //check if at end of row. if we are, break out of inner loop
  561.             if(ptCurrent.x==ptRowEnd.x && ptCurrent.y==ptRowEnd.y) break;
  562.  
  563.             //walk east to next tile
  564.             ptCurrent=TileWalker.TileWalk(ptCurrent,ISO_EAST);
  565.         }
  566.  
  567.         //check to see if we are at the last row. if we are, break out of loop
  568.         if(ptRowStart.x==ptCornerLowerLeft.x && ptRowStart.y==ptCornerLowerLeft.y) break;
  569.  
  570.         //move the row start and end points, based on the row number
  571.         if(dwRowCount&1)
  572.         {
  573.             //odd
  574.             //start moves SW, end moves SE
  575.             ptRowStart=TileWalker.TileWalk(ptRowStart,ISO_SOUTHWEST);
  576.             ptRowEnd=TileWalker.TileWalk(ptRowEnd,ISO_SOUTHEAST);
  577.         }
  578.         else
  579.         {
  580.             //even
  581.             //start moves SE, end moves SW
  582.             ptRowStart=TileWalker.TileWalk(ptRowStart,ISO_SOUTHEAST);
  583.             ptRowEnd=TileWalker.TileWalk(ptRowEnd,ISO_SOUTHWEST);
  584.         }
  585.  
  586.         //increase the row number
  587.         dwRowCount++;
  588.     }
  589.  
  590.     //flip to show the back buffer
  591.     lpddsMain->Flip(0,DDFLIP_WAIT);
  592. }
  593.  
  594.